<?php
/**
 * Driver
 *
 * Обработка данных водителей
 */
class Driver extends ActiveRecord  {
	protected $tableName = 'driver';
	public $pkName = 'ID_driver';
	
	protected $arrSettings = array(
		'created_at' => true,  // в БД храним время создания
		'updated_at' => true, 	// в БД храним время редактирования
		'author' => true			// в БД храним автора (ID_user)
	);
	
  public $validatesLengthOf = array(
		'first_name' => array('minimum' => 2, 'maximum' => 64, 'message' => 'Имя - от 2 до 64 символов'),
   		'last_name' => array('minimum' => 2, 'maximum' => 64, 'message' => 'Фамилия - от 2 до 64 символов'),
  		'middle_name' => array('minimum' => 2, 'maximum' => 64, 'message' => 'Отчество - от 2 до 64 символов')
  );
  public $validatesAcceptanceOf = array ('Car' => array('message' => 'Укажите хотя бы 1 автомобиль', 'on' => 'create'));
  
  public $validatesFormatOf = array(
  	// Должны приходить только 1 - нет отпыта, 2 - плохо, 3 - нормально, 4 - хорошо, 5 - отлично
    'last_experience' => array('message' => 'Получены неверные данные об опыте взаимодействия с водителем', 'with' => '|^[1-5]$|', 'allowNull' => false),
  	'km_cost_from' => array('message' => 'Цена за километр - число от 1 до 9999', 'with' => '|^[0-9]{1,4}$|'),
  	'km_cost_to' => array('message' => 'Цена за километр - число от 1 до 9999', 'with' => '|^[0-9]{1,4}$|')
  );
  
  public function beforeValidation() {
  		// Проверка данных расстояний
  		if($this->getField('DistanceWish')) {
  			$distancesArray = $this->getField('DistanceWish');
  			$flag = false;
  			for($i=0; $i<3; $i++) {
  				// Если это первая пара полей расстояния, то оно должно быть заполнено обязательно
  				if($i == 0 && $distancesArray[0]['km_from'] == '' || $distancesArray[0]['km_to'] == '') $flag = true;
  				// Если это непервая пара полей расстояния, то при заполнении одной из границ обязательно должна быть заполнена и другая
  				if($i > 0 && ($distancesArray[$i]['km_from'] == '' && $distancesArray[$i]['km_to'] != '' || $distancesArray[$i]['km_to'] == '' && $distancesArray[$i]['km_from'] != '')) $flag = true;
  			}
  			if($flag) Exception_ActiveRecord::addObjectException(get_class($this), 'DistanceWish', 'Нужно задать хотя бы одно расстояние, указав обе границы');
  			else {
  				for($i=0; $i<3; $i++) {
  					$objDistanceWish = new DistanceWish($distancesArray[$i]);
  					$objDistanceWish->validation('save');
  				}
  			}
  		}
  		
  		// Проверка данных телефонов
  		if($this->getField('DriverPhone')) {
  			$phonesArray = $this->getField('DriverPhone');
  			$flag = false;
  			for($i=0; $i<3; $i++) {
  				// Если это первое ьелефонно поле, то оно должно быть обязательно заполнено
  				if($i == 0 && $phonesArray[0]['number'] == '' || $phonesArray[0]['comment'] == '') $flag = true;
  				// Если это не первое телефонно поле, то проверяем обязательность заполнения пары телефон-комментарий
  				if($i > 0 && ($phonesArray[$i]['number'] == '' && $phonesArray[$i]['comment'] != '' || $phonesArray[$i]['comment'] == '' && $phonesArray[$i]['number'] != '')) $flag = true;
  			}
  			if($flag) Exception_ActiveRecord::addObjectException(get_class($this), 'DriverPhone', 'Не задан ни один телефон. Либо пропущен комментарий к нему');
  			else {
  				for($i=0; $i<3; $i++) {
  					$objDriverPhone= new DriverPhone($phonesArray[$i]);
  					$objDriverPhone->validation('save');
  				}
  			}
  		}
  		
  }
  
  public function afterSave() {
  	Service_Debug::setDebug();
  	$objDB = Service_Database::instance();
  	// После сохранения водителя (значит была выбрана хоть одна машина, верно указаны данные о желаяемых расстояниях) сохраняем данные о машинах
  	$carryingCapacities = $_POST['Driver']['Car'];
  	$distancesArray = $this->getField('DistanceWish');
  	$phonesArray = $this->getField('DriverPhone');
  	$stmt = 'INSERT INTO `car`(`ID_driver`,`carrying_capacity`,`created_at`) VALUES ';
  	$i = 1;
  	$currentTime = Service_Date::gLocalTime2BD();
  	foreach ($carryingCapacities as $carryingCapacitiyNumber => $flagOn) {
  		// Формируем запрос
  		$stmt .= "('" . $this->id . "','" . $carryingCapacitiyNumber . "','" . $currentTime . "')";
  		if ($i < count($carryingCapacities)) $stmt .= ',';
  		else $stmt .= ';';
  		$i++;
  	}
  	$objDB->query($stmt);
	// Добавление расстояний водителя
	// В beforeValidation было проверено, что одно расстояние заполнено точно
  	$stmt = 'INSERT INTO `distance_wish`(`ID_driver`,`km_from`,`km_to`,`created_at`) VALUES ';
  	for($i = 0; $i < 3; $i++) {
  		
  		if($distancesArray[$i]['km_from'] != '' && $distancesArray[$i]['km_to'] != '') {
  			$stmt .= "('" . $this->id . "','" . $distancesArray[$i]['km_from'] . "','" . $distancesArray[$i]['km_to'] . "','" . $currentTime . "')";
  			if($i == 2) $stmt .= ';';
  			elseif($distancesArray[$i+1]['km_from'] != '' && $distancesArray[$i+1]['km_to'] != '') $stmt .= ',';
  		}
  	}
  	$objDB->query($stmt);
  	
  	// Добавление телефонов водителя
  	// В beforeValidation было проверено, что один телефон указан точно
  	$stmt = 'INSERT INTO `driver_phone`(`ID_driver`,`number`,`comment`,`created_at`) VALUES ';
  	for($i = 0; $i < 3; $i++) {
  	
  		if($phonesArray[$i]['number'] != '' && $phonesArray[$i]['comment'] != '') {
  			$stmt .= "('" . $this->id . "','" . $phonesArray[$i]['number'] . "','" . $phonesArray[$i]['comment'] . "','" . $currentTime . "')";
  			if($i == 2) $stmt .= ';';
  			elseif($phonesArray[$i+1]['number'] != '' && $phonesArray[$i+1]['comment'] != '') $stmt .= ',';
  		}
  	}
  	$objDB->query($stmt);
  }
}
?>